


\subsubsubsection{25.2.1\hspace{0.2cm}比较}

元组是包含其他值的结构类型。要比较两个元组，比较元素就足够了，可以实现operator==的定义来比较两个定义的元素:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{typelist/tupleeq.hpp}
\begin{lstlisting}[style=styleCXX]
// basis case:
bool operator==(Tuple<> const&, Tuple<> const&)
{
	// empty tuples are always equivalent
	return true;
}

// basis case:
bool operator==(Tuple<> const&, Tuple<> const&)
{
	// empty tuples are always equivalent
	return true;
}
\end{lstlisting}

与许多关于类型列表和元组的算法一样，元素比较先访问头部元素，然后递归访问尾部元素。操作符!=、<、>、<=和>=的顺序类似。

\subsubsubsection{25.2.2\hspace{0.2cm}输出}

本章将创建新的元组类型，因此能够在执行程序中看到这些元组是很有用的。以下操作符<{}<可以打印任何可打印的元组元素类型:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{typelist/tupleio.hpp}
\begin{lstlisting}[style=styleCXX]
#include <iostream>

void printTuple(std::ostream& strm, Tuple<> const&, bool isFirst = true)
{
	strm << ( isFirst ? ’(’ : ’)’ );
}

template<typename Head, typename... Tail>
void printTuple(std::ostream& strm, Tuple<Head, Tail...> const& t,
				bool isFirst = true)
{
	strm << ( isFirst ? "(" : ", " );
	strm << t.getHead();
	printTuple(strm, t.getTail(), false);
}

template<typename... Types>
std::ostream& operator<<(std::ostream& strm, Tuple<Types...> const& t)
{
	printTuple(strm, t);
	return strm;
}
\end{lstlisting}

现在，创建和显示元组就很容易：

\begin{lstlisting}[style=styleCXX]
std::cout << makeTuple(1, 2.5, std::string("hello")) << ’\n’;
\end{lstlisting}

输出为

\begin{tcblisting}{commandshell={}}
(1, 2.5, hello)
\end{tcblisting}





















